package com.tron.dobest.semaphore;

import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.concurrent.Semaphore;


/**
 * 描述： 通过信号选举线程执行，并锁定线程。保证数据唯一。
 *
 * @author TRON
 * @since 2020-03-30
 */
@Api(tags = "区块管理")
@RestController
public class SemaphoreController {


    //定义资源的总数量
    private Semaphore semaphore = new Semaphore(1);


    @ApiOperation(value = "添加区块")
    @PostMapping("/addData")
    @Transactional
    public Object addData() {

        //可用资源数
        if (semaphore.availablePermits() > 0) {
            try {
                //请求占用一个资源
                semaphore.acquire(1);
                System.out.println("开始使用资源，执行业务代码");
                //放大资源占用时间，便于观察
                Thread.sleep(30000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                //释放一个资源
                semaphore.release(1);
            }
        }else {
            throw new RuntimeException("资源正在被使用，请稍后再试。");
        }
        return "success";
    }

}
